package com.demo.java.OD451_500.OD479;

import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【栈数据合并/空栈压数(E卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146407220
 */
public class OdMain {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] tmp1 = in.nextLine().split(" "); // 读取输入
        int[] a = new int[tmp1.length + 1];
        a[0] = 0; // 初始化栈
        for (int i = 0; i < tmp1.length; i++) {
            a[i + 1] = Integer.parseInt(tmp1[i]); // 将输入转化为整数
        }

        // i表示入栈的数字，j表示栈顶位置
        for (int i = 1, j = 0; i < tmp1.length + 1; ++i) {
            int sum = 0;
            for (int k = j; k >= 0; --k) {
                sum += a[k]; // 计算栈内元素的累加和
                if (sum == a[i]) { // 如果栈内某些元素的和等于当前数字
                    a[k] = 2 * a[i]; // 将这些数字更新为当前数字的两倍
                    a[i] = 0; // 将当前数字清零
                    for (int m = k + 1; m <= j; ++m) {
                        a[m] = 0; // 清空被替换的栈内元素
                    }
                    j = k + 1; // 更新栈顶位置
                    sum = Integer.MIN_VALUE; // 重置sum，跳出循环
                    break;
                }
                if (sum > a[i]) break; // 如果累加和已经大于当前数字，跳出循环
            }

            // 如果没有找到匹配的元素，则直接压入栈
            if (sum != Integer.MIN_VALUE) {
                a[j] = a[i]; // 入栈
                a[i] = 0; // 清空当前元素
                j++; // 更新栈顶位置
            }
        }

        // 输出栈内元素
        for (int i = tmp1.length; i > 0; --i) {
            if (a[i] != 0) {
                System.out.print(a[i] + " "); // 打印栈内有效元素
            }
        }
        System.out.print(a[0]); // 输出栈底元素
    }
}